package indi.cloud.common.elasticsearch;

import indi.cloud.common.elasticsearch.core.EsBaseReq;
import indi.cloud.common.elasticsearch.core.EsPageable;
import indi.cloud.common.elasticsearch.core.EsResult;
import com.alibaba.fastjson.JSONObject;
import org.springframework.data.elasticsearch.core.query.Query;
import org.springframework.validation.annotation.Validated;

import javax.validation.constraints.NotBlank;
import java.util.List;

/**
 * 对ElasticSearch 数据操作
 *
 * @author:
 */
@Validated
public interface EsDataService {

    /**
     * 添加一条数据
     *
     * @param t obj
     */
    <T> T save(T t);

    /**
     * 批量添加数据
     *
     * @param tList
     */
    <T> boolean batchSave(List<T> tList);

    /**
     * 单个更新
     *
     * @param t
     * @param <T>
     * @return
     */
    <T> boolean update(T t);

    /**
     * 批量更新
     *
     * @param tList
     * @param <T>
     * @return
     */
    <T> boolean batchUpdate(List<T> tList);

    /**
     * 删除
     *
     * @param clazz
     * @param id
     * @param <T>
     * @return
     */
    <T> boolean delete(Class<T> clazz, String id);

    /**
     * 批量删除
     *
     * @param clazz
     * @param idList
     * @param <T>
     * @return
     */
    <T> boolean batchDelete(Class<T> clazz, List<String> idList);

    /**
     * 根据id查询一个对象
     *
     * @param clazz
     * @param id
     * @return
     */
    <T> T findById(Class<T> clazz, String id);

    /**
     * 根据查询条件查询对象
     *
     * @param clazz
     * @param query
     * @return
     */
    <T> T findOne(Class<T> clazz, Query query);

    /**
     * 根据查询条件查询对象
     *
     * @param clazz
     * @param req
     * @return
     */
    <T> T findOne(Class<T> clazz, EsBaseReq req);

    /**
     * 查询某个对象的所有数据，慎用
     *
     * @param clazz
     * @return
     */
    <T> EsResult<List<T>> findAll(Class<T> clazz);

    /**
     * 查询某个对象的所有数据，提供分页排序参数
     *
     * @param clazz
     * @param pageable
     * @return
     */
    <T> EsResult<List<T>> findAll(Class<T> clazz, EsPageable pageable);

    /**
     * 根据条件查询数据
     *
     * @param t
     * @param query
     * @return
     */
    <T> EsResult<List<T>> search(Class<T> t, Query query);


    /**
     * 根据条件查询数据
     * 滚动搜索
     *
     * @param t
     * @param query
     * @param indexName es索引名
     * @return
     */
    <T> EsResult<List<T>> searchScroll(Class<T> t, Query query,String indexName);

    /**
     * 根据es查询条件查询
     *
     * @param t
     * @param request
     * @return
     */
    <T> EsResult<List<T>> search(Class<T> t, EsBaseReq request);

    /**
     * 手写dsl查询条件查询数据
     *
     * @param t
     * @param dsl
     * @return
     */
    <T> EsResult<List<T>> dslSearch(Class<T> t, @NotBlank(message = "dsl语句不能为空") String dsl);

//    /**
//     * 使用SQL 条件查询数据
//     *
//     * @param t
//     * @param sql
//     * @return
//     */
//    <T> List<T> sqlSearch( Class<T> t, @NotBlank(message = "sql语句不能为空") String sql);
//
//    /**
//     * 使用SQL查询单个对象
//     *
//     * @param t
//     * @param sql
//     * @return
//     */
//    <T> T sqlFindOne( Class<T> t, @NotBlank(message = "sql语句不能为空") String sql);

    <T> EsResult<List<T>> search(Class<T> t, JSONObject request);
}


